<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8"/>
    <title>工厂模式</title>
</head>
<body>

<script type="text/javascript">
    /*
    * 通过工厂方法或类创建的对象在设计上都继承了相同的父类这个思想，他们都是实现专门功能的子类。
    * 有时候公共父类是一个包含了工厂方法的同一个类。
    * 继承父构造函数的仅是公用重复的代码部分。
    * */
    // 父构造函数
    function CarMaker() {};

    // 父类的一个原型方法
    CarMaker.prototype.drive = function() {
        return "Vroom, I have" + this.door + "doors";
    };

    // 静态工厂方法
    CarMaker.factory = function(type) {
        // 如果不存在子类构造函数，则发生错误
        if(typeof CarMaker[type] !== "function") {
            throw {
                name: "Error",
                message: type + " doesn't exist"
            };
        }

        // 如果构造函数是一直存在的，我们要是原型继承父类，且仅只继承一次
        if(typeof CarMaker[type].prototype.drive !== "function") {
            CarMaker[type].prototype = new CarMaker();
        }

        return new CarMaker[type]();
    };

    // 定义子类
    CarMaker.A = function() {
        this.door = 2;
    };
    CarMaker.B = function() {
        this.door = 3;
    };
    CarMaker.C = function() {
        this.door = 4;
    };

    Object.prototype.aa = function(){
        alert("aa");
    };
    Number.prototype.bb = function() {
        alert("bb");
    };
    var aa = Object(22);
    var bb = String();
    aa.aa();
    aa.bb();
    bb.aa();
//    bb.bb();
    alert(aa);

</script>
</body>
</html>